\subsection{Parser}

\begin{frame}{Parser}
\tableofcontents[currentsection,currentsubsection]
\end{frame}

\begin{frame}{Parser}
\begin{block}
\LARGE codigo.sql \pause $ \rightarrow $ Representación de la Base de Datos
\end{block}
\pause análisis léxico + análisis sintáctico
\end{frame}



\subsubsection{Analizador Léxico}

\begin{frame}{Analizador Léxico}
\begin{itemize}
\item Convierte las palabras en \alert{Tokens}\pause:

 \cod{CREATE} $\rightarrow$ token CREATE
\item Asignándoles un valor si fuera necesario. \pause

 \cod{CREATE TABLE \alert{T}} \pause $\rightarrow$ token: IDENTIFIER value $"T"$
\item Para realizar el análisis léxico utilizamos \alert{Flex}
\end{itemize}
\end{frame}

\subsubsection{Analizador Sintáctico}
\begin{frame}{Analizador Sintáctico}
\begin{itemize}

\item Genera la estructura de la base de datos a partir del código SQL\pause
\item Gramática simplificada\pause
\item La herramienta no es un compilador SQL \pause
\item Utilizamos \alert{GNU Bison} como analizador sintáctico.

\end{itemize}
\end{frame}

\begin{frame}[fragile]{Ámbito de aplicación}
\begin{itemize}
\item \textbf{Claves} primarias y ajenas \begin{verbatim}PRIMARY KEY, FOREIGN KEY \end{verbatim}
\item \textbf{Uniones e intersecciones} de consultas \begin{verbatim}UNION, INTERSECTION \end{verbatim}
\item \textbf{Expresiones aritmético-lógicas} en las secciones FROM y SELECT
\begin{itemize}
\item \textbf{Expresiones lógicas}
 \begin{verbatim}
AND, OR, NOT, =, <, <=, =>,<> 
\end{verbatim}
\item \textbf{Expresiones aritméticas} 
\begin{verbatim}
+, -, /, *
\end{verbatim}
\end{itemize}
\item \textbf{Tipos} enteros no nulos 
\begin{verbatim}
INT, INTEGER
\end{verbatim}
\item \textbf{Consultas básicas} de la forma \cod{SELECT} E1 ... En \cod{FROM} R1 ... RM \cod{WHERE} C
\item \textbf{Consultas existenciales} anidadas.
\begin{verbatim}
EXISTS, NOT EXISTS
\end{verbatim}
\item \textbf{Consultas con agregados} (No soportado en la versión actual del prototipo 
\begin{verbatim}
 GROUP BY, HAVING 
\end{verbatim}
\end{itemize}
\end{frame}
\begin{frame}
Además el código admitido tendrá las siguientes restricciones:
\begin{itemize}
\item \textbf{Clausula \cod{FROM} sin subconsultas}. Esto no supone una pérdida de generalidad pues las subconsultas en el \cod{FROM} pueden ser sustituidas por vistas, admitidas en nuestra herramienta.
\item \textbf{\cod{DISTINCT} no permitido}. El operador \cod{DISTINCT} puede ser sustituido por consultas con agregados equivalentes.
\item \textbf{Operador \cod{MINUS}, operaciones \cod{JOIN} y valores nulos no considerados}. Por simplicidad no se consideran estas características, aunque podrían ser incluidas en futuras implementaciones
\item \textbf{Consultas recursivas} no contempladas en la herramienta.
\end{itemize}
\end{frame}

\begin{frame}[fragile]

\begin{block}{\cod{CREATE TABLE notas ( dni int, nota int, PRIMARY KEY (dni))}}
\begin{verbatim}
TABLE: notas
COLUMNS:
<[NAME: dni, TYPE: INTEGER],[NAME: nota, TYPE: INTEGER]>
TABLE CONSTRAINTS:
<[PRIMARY KEY: <[Name: dni]>]>
\end{verbatim}
\end{block}

\end{frame}

\begin{frame}[fragile]

\begin{block}{\cod{CREATE VIEW aprobados AS SELECT dni FROM notas WHERE nota >= 5}}
\begin{verbatim} 
VIEW: aprobados
COLUMNS:
<[Name: dni]>
QUERY:
{
SELECT : (notas.dni)
FROM: [<notas as notas>]
WHERE : (.nota >= 5) 
}
\end{verbatim}
\end{block}
\pause Nota: esta representación de la estructura generada por el parser puede obtenerse al ejecutar la herramienta con la opción \cod{--verbose}
\end{frame}